package cn.highedu.coolsharkhub.service.impl;

import cn.highedu.coolsharkhub.service.UploadService;
import cn.highedu.coolsharkhub.service.exception.BlankParameterException;
import cn.highedu.coolsharkhub.service.exception.FileSaveException;
import cn.highedu.coolsharkhub.service.exception.FileSuffixNotAllowedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.Set;
import java.util.UUID;

@Service
public class UploadServiceImpl implements UploadService {
    Logger logger = LoggerFactory.getLogger(UploadServiceImpl.class);

    /**
     * 注入上传文件的路径
     * 读取application-dev.yml文件
     */
    @Value("${upload.location}")
    private File storePath;
    /**
     * 注入文件上传允许的格式
     * 配置内容是以逗号分割 读取之后会自动转换为Set集合
     */
    @Value("${upload.suffixes}")
    private Set<String> suffixes;

    @Override
    public String toString() {
        return "UploadServiceImpl{" +
                "storePath=" + storePath +
                ", suffixes=" + suffixes +
                '}';
    }

    /**
     * 保存上传的文件
     * @param file 封装了上传的文件
     * @return 上传的文件名
     */
    @Override
    public String saveUploadFile(MultipartFile file) {
        if (file == null || file.isEmpty()) {
            logger.info("文件为空, 或者上传控件名称不是imageFile");
            throw new BlankParameterException("文件为空, 或者上传控件名称不是imageFile");
        }
        // 获取文件名
        String fileName = file.getOriginalFilename();
        logger.info("原始文件名: {}", fileName);
        // 获取文件的扩展名(文件名的后缀)
        String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
        // 判断文件扩展名是否合法
        if (!suffixes.contains(suffix)) {
            logger.info("文件格式不正确: {}", suffix);
            throw new FileSuffixNotAllowedException("文件格式不正确");
        }
        // 生成一个新的文件名 防止文件名重名 导致文件被替换
        fileName = UUID.randomUUID() + suffix; // uuid是一个32位16进制格式的字符串 例如E10ADC3949BA59ABBE56E057F20F883E
        // 获取当前的日期
        LocalDate date = LocalDate.now();
        // 格式化日期
        String datePath = date.format(DateTimeFormatter.ofPattern("/yyyy/MM/dd/"));
        // 创建文件夹
        File dirFile = new File(storePath, datePath);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        logger.info("文件存储路径: {}", dirFile.getAbsolutePath());
        // 保存文件
        try {
            file.transferTo(new File(dirFile, fileName));
            logger.info("文件保存成功: {}", datePath + fileName);
            // 返回保存路径+文件名
            return datePath + fileName;
        } catch (IOException e) {
            logger.error("文件保存失败", e);
            throw new FileSaveException("文件保存失败");
        }
    }

    /**
     * 删除上传的文件
     * @param url 文件路径
     */
    @Override
    public void deleteUploadFile(String url) {
        if (url == null || url.isEmpty()) {
            logger.info("文件路径不能为空");
            throw new BlankParameterException("文件路径不能为空");
        }
        // 创建文件
        File file = new File(storePath, url);
        if (file.exists()) {
            logger.info("成功删除文件: {}", url);
            // 删除文件
            file.delete();
        }
        else {
            logger.info("文件不存在");
        }
    }
}
